package org.cyz.tools.core.assembly.tableview;

import javafx.event.ActionEvent;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

/**
 * @author abccy
 * @title: TextFieldTreeCellImpl
 * @projectName RedisGUI
 * @description: TODO
 * @date 2020-9-622:45
 */
public class TextFieldTreeCellImpl extends TreeCell<String> {

    // 文本编辑
    private TextField textField;

    // 添加菜单
    private final ContextMenu addMenu = new ContextMenu();

    // 构造方法,如果对儿子单元有特殊的需求可以在构造方法里实现
    public TextFieldTreeCellImpl() {

        // 新增菜单栏目
        MenuItem addMenuItem = new MenuItem("Add Employee");
        addMenu.getItems().add(addMenuItem);
        addMenuItem.setOnAction((ActionEvent t) -> {
            TreeItem newEmployee =
                    new TreeItem<>("New Employee");
            getTreeItem().getChildren().add(newEmployee);
        });
    }


    // 所有的TreeView的儿子控件都是支持Edit的,所有每次选中编辑的时候都会执行该方法
    @Override
    public void startEdit() {
        super.startEdit();

        if (textField == null) {
            // 每个单元会拥有一个文本框
            createTextField();
        }
        setText(null);
        setGraphic(textField);
        textField.selectAll();
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();
        // 清空编辑
        setText((String) getItem());
        setGraphic(getTreeItem().getGraphic());
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        // 为空不处理
        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            // 如果正在编辑
            if (isEditing()) {
                if (textField != null) {
                    // 设置为原来Item的内容
                    textField.setText(getString());
                }
                setText(null);
                // 设置显示为文本内容
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(getTreeItem().getGraphic());
                // 如果有儿子  并且 有父亲，则拥有添加顾客菜单栏
                if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) {
                    setContextMenu(addMenu);
                }else {
                    // 其他情况没有菜单栏
                    setContextMenu(null);
                }
            }
        }
    }

    // 创建文本区，名字为该item名
    private void createTextField() {
        textField = new TextField(getString());

        // 键盘事件处理，松开键盘时
        textField.setOnKeyReleased((KeyEvent t) -> {
            if (t.getCode() == KeyCode.ENTER) {
                // 输入回车时，单元编辑为文本框内容
                commitEdit(textField.getText());
            } else if (t.getCode() == KeyCode.ESCAPE) {
                // 输入退出键时,清空编辑
                cancelEdit();
            }
        });
    }

    // 获取该Item的名字
    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
}
